'\" t
.TH "BOOTUP" "7" "" "systemd 231" "bootup"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.\" http://bugs.debian.org/507673
.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html
.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.ie \n(.g .ds Aq \(aq
.el       .ds Aq '
.\" -----------------------------------------------------------------
.\" * set default formatting
.\" -----------------------------------------------------------------
.\" disable hyphenation
.nh
.\" disable justification (adjust text to left margin only)
.ad l
.\" -----------------------------------------------------------------
.\" * MAIN CONTENT STARTS HERE *
.\" -----------------------------------------------------------------
.SH "NAME"
bootup \- 系统启动流程
.SH "描述"
.PP
在系统启动过程中要涉及多个不同的组件。 按下电源按钮后，首先BIOS/UEFI做最基本的硬件自检与初始化， 然后加载预设/手动选择的磁盘/网络上的引导加载器(例如GRUB2)， 引导加载器进一步从磁盘/网络上加载操作系统内核(例如Linux)。 对于Linux来说，内核将会(可选的)解压一个initrd(initial RAM disk)镜像(可以用
\fBdracut\fR(8)
之类的工具生成)， 并执行由"rdinit="内核引导选项指定的init程序(例如
\fBsystemd\fR(1)) 以寻找并挂载根文件系统。 完成根文件系统的挂载之后，内核启动由"init="内核引导选项指定的init程序(例如
\fBsystemd\fR(1)) 以接管系统的控制权。 该init程序将会负责检测所有其他的硬件设备、挂载必要的文件系统、启动所有必要的服务，等等。
.PP
关机时， init程序将会停止所有服务、 卸载所有文件系统、 (可选的)返回initrd环境卸载根文件系统， 最后关闭电源。
.PP
其他有关系统启动流程的信息可以参考
\fBboot\fR(7)
手册。
.SH "常规启动流程"
.PP
当成功挂载了"root="内核引导选项指定的根文件系统之后，内核将启动由"init="内核引导选项指定的init程序， 从这个时间点开始，即进入了"常规启动流程"： 检测硬件设备并加载驱动、挂载必要的文件系统、启动所有必要的服务，等等。对于
\fBsystemd\fR(1)
系统来说，上述"init程序"就是 systemd 进程， 而整个"常规启动流程"也以几个特殊的 target 单元(详见
\fBsystemd.target\fR(5)) 作为节点，被划分为几个阶段性步骤。 在每个阶段性步骤内部，任务是高度并行的， 所以无法准确预测同一阶段内单元的先后顺序， 但是不同阶段之间的先后顺序总是固定的。
.PP
当启动系统时， systemd 将会以
default\&.target
为启动目标， 借助单元之间环环相扣的依赖关系，即可完成"常规启动流程"。
default\&.target
通常只是一个指向
graphical\&.target(图形界面) 或
multi\-user\&.target(文本控制台) 的软连接。 为了强制启动流程的规范性以及提高单元的并行性， 预先定义了一些具有特定含义的 target 单元。详见
\fBsystemd.special\fR(7)
手册。
.PP
下面的图表解释了 这些具有特定含义的 target 单元之间的依赖关系 以及各自在启动流程中的位置。 图中的箭头表示了单元之间的依赖关系与先后顺序， 整个图表按照自上而下的时间顺序执行。
.sp
.if n \{\
.RS 4
.\}
.nf
local\-fs\-pre\&.target
         |
         v
 (各个 mounts 与       (各个 swap      (各个加密块设备
 fsck services\&.\&.\&.)     devices\&.\&.\&.)        devices\&.\&.\&.)         (各个底层服务:      (各个底层虚拟
         |                  |                  |              udevd, tmpfiles,    文件系统 mounts:
         v                  v                  v              random seed,        mqueue, configfs,
  local\-fs\&.target      swap\&.target     cryptsetup\&.target          sysctl, \&.\&.\&.)      debugfs, \&.\&.\&.)
         |                  |                  |                    |                    |
         \e__________________|_________________ | ___________________|____________________/
                                              \e|/
                                               v
                                        sysinit\&.target
                                               |
          ____________________________________/|\e________________________________________
         /                  |                  |                    |                    \e
         |                  |                  |                    |                    |
         v                  v                  |                    v                    v
      (各个               (各个                |                  (各个           rescue\&.service
    timers\&.\&.\&.)          paths\&.\&.\&.)              |               sockets\&.\&.\&.)               |
         |                  |                  |                    |                    v
         v                  v                  |                    v              \fIrescue\&.target\fR
   timers\&.target      paths\&.target             |             sockets\&.target
         \&.                  |                  |                    |
         \&.                  \e_________________ | ___________________/
         \&.\&.\&.\&.\&.\&.\&.\&.\&.\&.\&.\&.\&.\&.\&.\&.\&.\&.\&.\&.\&.\&.\&.\&.\&.\&.\&.\&.\&.\&.\&.\&.\&.\&.\&.\&. \e|/
                                               v
                                         basic\&.target
                                               |
          ____________________________________/|                                 emergency\&.service
         /                  |                  |                                         |
         |                  |                  |                                         v
         v                  v                  v                                 \fIemergency\&.target\fR
     display\-        (图形界面所必需    (各个系统服务)
 manager\&.service      的各个系统服务)          |
         |                  |                  |
         |                  |                  v
         |                  |           \fImulti\-user\&.target\fR
         |                  |                  |
         \e_________________ | _________________/
                           \e|/
                            v
                  \fIgraphical\&.target\fR
.fi
.if n \{\
.RE
.\}
.PP
用\fI斜体\fR标识的目标单元经常被用作启动目标。 有两种方法可以指定启动目标： (1)使用
\fIsystemd\&.unit=\fR
内核引导选项(参见
\fBsystemd\fR(1))； (2)使用
default\&.target
软连接。
.PP
因为
timers\&.target
以异步方式包含在
basic\&.target
中， 所以 timer 单元可以依赖于在
basic\&.target
之后才启动的服务。
.SH "INITRD(INITIAL RAM DISK) 启动流程"
.PP
在initrd内部， 也可以将 systemd 用作init程序(由"rdinit="内核引导选项指定)。
.PP
此时
initrd\&.target
将是默认目标。 initrd内部启动流程的上半部分与前一小节
basic\&.target
之前的部分完全相同。 随后的启动流程将以
initrd\&.target
为目标(如下图所示)。 当根文件系统设备可用时，将到达
initd\-root\-device\&.target
目标。 如果成功的将根文件系统挂载到
/sysroot
目录，那么
sysroot\&.mount
单元将被启动，然后进一步到达
initrd\-root\-fs\&.target
目标。
initrd\-parse\-etc\&.service
将会分析
/sysroot/etc/fstab
文件以挂载
/usr
(若需要) 与带有
\fIx\-initrd\&.mount\fR
标记的挂载点。 所有这些挂载点都将被挂载到
/sysroot
之下，然后流程到达
initrd\-fs\&.target
目标。再接下来
initrd\-cleanup\&.service
将会使用
\fBsystemctl \-\-no\-block isolate\fR
命令启动
initrd\-switch\-root\&.target
目标。 因为 isolate 表示立即停止所有在新的目标单元中不需要的进程， 所以此动作实际上是为接下来切换根目录做预先的准备(也就是清理环境)。 最后，启动
initrd\-switch\-root\&.service
服务，将系统的根目录切换至
/sysroot
目录。
.sp
.if n \{\
.RS 4
.\}
.nf
                                    (之前的流程与上一小节完全相同)
                                               :
                                               v
                                         basic\&.target
                                               |                                 emergency\&.service
                        ______________________/|                                         |
                       /                       |                                         v
                       |            initrd\-root\-device\&.target                    \fIemergency\&.target\fR
                       |                       |
                       |                       v
                       |                  sysroot\&.mount
                       |                       |
                       |                       v
                       |             initrd\-root\-fs\&.target
                       |                       |
                       |                       v
                       v            initrd\-parse\-etc\&.service
              (各个自定义的                    |
             initrd services\&.\&.\&.)               v
                       |            (sysroot\-usr\&.mount 以及
                       |             fstab 中带有 x\-initrd\&.mount
                       |               标记的各个挂载点)
                       |                       |
                       |                       v
                       |                initrd\-fs\&.target
                       \e______________________ |
                                              \e|
                                               v
                                          initrd\&.target
                                               |
                                               v
                                     initrd\-cleanup\&.service
                          (使用 isolates 启动 initrd\-switch\-root\&.target)
                                               |
                                               v
                        ______________________/|
                       /                       v
                       |        initrd\-udevadm\-cleanup\-db\&.service
                       v                       |
              (各个自定义的                    |
             initrd services\&.\&.\&.)               |
                       \e______________________ |
                                              \e|
                                               v
                                   initrd\-switch\-root\&.target
                                               |
                                               v
                                   initrd\-switch\-root\&.service
                                               |
                                               v
                                     切换到主机上的操作系统
.fi
.if n \{\
.RE
.\}
.SH "关机流程"
.PP
systemd 系统在关机时同样遵循固定的流程， 具体如下图所示：
.sp
.if n \{\
.RS 4
.\}
.nf
     (与所有系统服务互斥)    (与所有文件系统 mounts, swaps, cryptsetup devices 互斥)
            |                                             |
            v                                             v
     shutdown\&.target                                 umount\&.target
            |                                             |
            \e____________________________________   ______/
                                                 \e /
                                                  v
                                        (各个底层 services)
                                                  |
                                                  v
                                            final\&.target
                                                  |
            _____________________________________/ \e_________________________________
           /                         |                        |                      \e
           |                         |                        |                      |
           v                         v                        v                      v
systemd\-reboot\&.service   systemd\-poweroff\&.service   systemd\-halt\&.service   systemd\-kexec\&.service
           |                         |                        |                      |
           v                         v                        v                      v
    \fIreboot\&.target\fR             \fIpoweroff\&.target\fR            \fIhalt\&.target\fR           \fIkexec\&.target\fR
.fi
.if n \{\
.RE
.\}
.PP
用\fI斜体\fR标识的目标单元经常被用作关机目标。
.SH "参见"
.PP
\fBsystemd\fR(1),
\fBboot\fR(7),
\fBsystemd.special\fR(7),
\fBsystemd.target\fR(5),
\fBdracut\fR(8)
.\" manpages-zh translator: 金步国
.\" manpages-zh comment: 金步国作品集：http://www.jinbuguo.com
